# 售前方案多智能体
import json
import re

import requests


def chat(prompt):
    url = "http://192.168.1.102:11434/api/generate"
    data = {
        "model": "qwen:32b",
        "prompt": prompt,
        # "temperature": 0.5,
        # "top_p": 0.8,
        "stream": False,
    }
    res = requests.post(url, json=data)
    content = res.json()["response"]
    return content
class PreSalesAssistant:
    def __init__(self):
        # 初始化多智能体系统，创建各个角色的实例
        self.roles = {
            "需求分析师": RequirementAnalyzer(),  # 负责分析客户需求
            # "行业专家": IndustryExpert(),      # 提供行业知识和最佳实践
            # "技术顾问": TechnicalAdvisor(),    # 提供技术解决方案和建议
            # "财务分析师": FinancialAnalyst(), # 负责成本预算和财务分析
            # "法律顾问": LegalAdvisor(),        # 确保方案合法合规
            # "CRM专家": CRMExpert(),          # 管理客户关系和沟通
            # "方案设计师": PlanDesigner(),   # 整合信息，撰写方案文档
            # "质量控制专家": QualityControlExpert(), # 监督方案质量
            "大纲编辑师": AlsoEditor(),
            "文档撰写师": ContentEditor(),  # 审查和编辑方案内容
            # "格式设计师": FormatDesigner(),  # 负责文档的视觉排版和设计  这里先注释掉 后面可能会根据需求 去生成markdown 或word文档的特殊格式  甚至自动插入图标等
            "语言润色师": LanguagePolisher(),  # 优化文档语言和表达
        }

    def execute(self, client_requirements):
        # 执行方案撰写流程
        for role, role_instance in self.roles.items():
            # 输入就是输出
            print(client_requirements)
            client_requirements = role_instance.process(client_requirements)
        return client_requirements

# 定义各个角色的类和处理逻辑

class AlsoEditor:

    def process(self,requirements):
        """
        大纲编辑师
        传入材料 生成大纲
        :param requirements:
        :return:
        """
        prompt = """
            ### 大纲编辑师 - 售前方案文档大纲撰写Prompt
            **目标**：根据提供的材料，精心策划并生成一份详尽的、结构化的售前方案文档大纲，该大纲应该是json格式的 ，  每个标题的key 都是 section , 确保文档内容全面、逻辑清晰、针对性强。
            **操作步骤**：
            1. **材料审阅**：仔细审阅所有提供的输入材料，包括客户需求、市场分析、产品特性、竞争对手信息等，确保对项目的各个方面都有深入的理解。
            2. **确定目标**：明确售前方案文档的目的和目标，例如，解决客户痛点、展示产品优势、提供市场分析等。
            3. **初步分节**：根据材料内容和文档目标，初步划分大纲的主要章节和子章节，确保涵盖所有关键信息点。
            4. **细化内容**：为每个章节和子章节定义具体的内容和目标，确保每个部分都有明确的作用和意义。
            5. **逻辑排序**：根据内容的相关性和逻辑性，对章节进行排序，确保文档的流畅性和连贯性。
            6. **关键点标注**：在大纲中标注关键论点和支持点，这些将成为撰写文本时的重点内容。
            7. **考虑视觉元素**：规划图表、图像和其他视觉元素的插入位置，以增强文档的表现力和易读性。
            8. **审阅和调整**：完成初步大纲后，进行审阅和必要的调整，以确保大纲的完整性和实用性。
            9. **获取反馈**：如果可能，与客户或其他团队成员分享大纲草案，收集反馈并进行优化。
            
            
            **示例大纲**：
            
            {
              "document_title": "售前方案文档大纲",
              "sections": [
                {
                  "title": "引言",
                  "subsections": []
                },
                {
                  "title": "市场与客户需求分析",
                  "subsections": []
                },
                {
                  "title": "产品与服务优势",
                  "subsections": []
                },
                {
                  "title": "竞争环境分析",
                  "subsections": []
                },
                {
                  "title": "解决方案实施计划",
                  "subsections": []
                },
                {
                  "title": "预期效益与投资回报",
                  "subsections": []
                },
                {
                  "title": "结论与建议",
                  "subsections": []
                }
              ]
            }
         
                        
            
            **示例输入**：
        """+requirements
        content  = chat(prompt)
        print(content)
        print(f"""
                大纲编辑师 生成的大纲如下================================:
                {content}
                """)
        # 从返回的内容中提取大纲

        # 正则表达式来匹配JSON字符串

        parsed_json = json.loads(content)


        return parsed_json
class RequirementAnalyzer:
    def process(self, requirements):

        prompt = """
        ### 需求分析师 - 客户需求分析Prompt

        **目标**：深入分析客户的特定需求和预期目标，以便创建一个定制化、有说服力的售前方案文档。
        
        **操作步骤**：
        
        1. **详细了解客户背景**：首先，收集客户的基本信息，包括行业领域、企业规模、市场定位等，以便更好地理解客户的业务环境。
        2. **明确客户需求**：请详细描述客户希望解决的问题或改进的领域。这些需求可能涉及产品功能、服务质量、成本控制等方面。
        3. **确定预期目标**：阐述客户希望通过合作达到的具体目标。这些目标应该是可衡量的，如提高效率、增加收入、降低成本等。
        4. **分析客户痛点**：识别客户在当前业务流程中遇到的主要挑战和痛点，这将帮助我们提供更加针对性的解决方案。
        5. **考虑客户的长期愿景**：除了短期目标，也要考虑客户在未来几年的发展规划和愿景，确保方案能够支持其长期战略。
        6. **收集客户的反馈和偏好**：如果可能的话，收集客户对过往合作或类似方案的反馈和偏好，这将帮助我们更好地调整方案以满足其需求。
        7. **整理信息并撰写概要**：基于收集到的信息，撰写一份客户需求和预期目标的概要，这将作为润色售前方案文档的基础。
        
        **示例输入**：
        
        """+str(requirements)

        # 示例输入如下:
        # 客户是一家中型企业，专注于可再生能源领域。他们希望提高生产效率，降低至少10 % 的运营成本，并在接下来的一年内扩大市场份额。他们面临的主要挑战是设备老化和市场竞争加剧。客户过去对技术升级反应积极，但对成本控制有严格的要求。
        print("========================需求分析师分析如下: -------------------------------------------------")
        content  = chat(prompt)
        print(content)
        print("========================需求分析师完毕 开始进行大纲撰写 : -------------------------------------------------")
        return content

class IndustryExpert:
    def process(self, requirements):
        # 提供行业知识和最佳实践
        # 这里应该包含具体的逻辑代码
        return None

# ... 其他角色的类定义和处理逻辑 ...

class FormatDesigner:
    def process(self, plan):
        # 设计方案文档的格式和布局
        # 这里应该包含具体的逻辑代码
        return None

class ContentEditor:


    def generator_text(self,pre_text,sec):
        prompt=f"""
        ### 文档撰写师 - 售前方案文档内容生成Prompt（基于前文）

        **目标**：在确保每个章节内容与前文紧密相连的基础上，根据提供的标题和内容要点撰写出详尽、有说服力、结构化的售前方案文档内容。
        
        **操作步骤**：
        
        1. **复习前文内容**：在开始撰写新章节之前，仔细复习前文的内容，确保理解其核心观点和论述。
        2. **构建桥梁**：在每个新章节的开头，撰写一段过渡性文本，将前文的关键信息与新章节的主题连接起来。
        3. **明确章节目标**：基于每个标题，明确该章节旨在解决的问题、提供的信息或达成的目标。
        4. **详细阐述要点**：针对每个内容要点，撰写详尽的段落，确保每个要点都有充分的论据支持，并且与前文逻辑一致。
        5. **使用清晰的语言**：保持语言的清晰性和专业性，确保文档对所有读者都易于理解，同时保持与前文一致的语调和风格。
        6. **强调解决方案的优势**：在相关内容中，突出解决方案的竞争优势，以及它如何基于前文内容更好地满足客户需求。
        7. **整合视觉元素**：在适当的地方，建议添加图表、图像或其他视觉元素，以增强信息的传达效果，并与前文的视觉风格保持一致。
        8. **总结和前瞻**：在每个章节的末尾，总结关键信息，并为读者提供对下一章节内容的预告或引导。
        9. **审阅和润色**：完成初稿后，进行详细的审阅和润色，确保文档内容连贯、无语法错误，并且与整体文档的风格和语调保持一致。
        10. **反馈和迭代**：如果可能，获取客户或其他利益相关者的反馈，并根据反馈进行必要的调整和改进。
        
        
        **前文内容**：
        {pre_text}
        
        **当前章节**：
        {sec}
        """

        content = chat(prompt)
        return content



    def process(self, plan):
        # 内容编辑  文档撰写  审查和编辑方案内容
        # 开始循环撰写
        texts=[]
        print("==================文档撰写师开始撰写文档==================================")
        for sec in plan["sections"]:
            text = self.generator_text("\r\n".join(texts),sec)
            print(text)
            texts.append(text)

        print("=======================最终的文档如下:==================================")
        print("\r\n".join(texts))

        return "\r\n".join(texts)


class LanguagePolisher:
    def process(self, plan):
        # 优化文档语言和表达
        #  到这里应该是一个最终的文档了。 现在我们写一个prompt去润色这个文档

        prompt="""
            ### 语言润色师 - 售前方案文档润色Prompt

            **目标**：对最终的售前方案文档进行语言润色，确保文档表达精准、流畅、具有说服力，同时符合专业标准和客户期望。
            
            **操作步骤**：
            
            1. **全面审阅**：细致阅读整个文档，理解每个章节的核心内容和目的，确保润色工作能够符合文档的整体目标。
            2. **优化词汇选择**：使用更加精确和专业的词汇替换普通或泛泛的词语，同时保持语言的通俗易懂，确保专业和非专业读者都能理解。
            3. **增强语句流畅性**：调整句子结构，避免冗长和复杂的句子，使文档内容更加流畅、易于阅读。
            4. **统一语调和风格**：确保整个文档的语调和风格一致，符合公司的品牌形象和专业标准,不要那么像ai ,必须像真人。
            5. **强化说服力**：通过添加修辞手法，如比喻、排比等，增强文档的说服力和感染力。
            6. **检查语法和拼写**：仔细检查文档中的语法和拼写错误，确保文档的专业性。
            7. **考虑文化差异**：如果文档面向国际客户，注意文化差异和语言习惯，避免可能的误解或冒犯。
            8. **审阅反馈**：在完成润色后，获取第三方的审阅反馈，以便进一步优化和改进文档。
            9. **最终校对**：进行最终的校对，确保所有修改都已就位，文档准备完毕。
            
            **示例输入**：
            - 原始文本：“我们的解决方案旨在通过先进的技术提升企业效率，降低运营成本，并增强客户满意度。”

        """+plan

        s=chat(prompt)

        return s
# 客户端调用示例
client_requirements = {
    # 初始客户要求和信息
#     现实场景下 这些信息应该是  传入各种  项目信息 ,数据 等
    "客户需求":"客户是一家中型企业，专注于可再生能源领域。他们希望提高生产效率，降低至少10 % 的运营成本，并在接下来的一年内扩大市场份额。他们面临的主要挑战是设备老化和市场竞争加剧。客户过去对技术升级反应积极，但对成本控制有严格的要求。"
}
#

requirements = """
客户是一家中型企业，专注于可再生能源领域。他们希望提高生产效率，降低至少10 % 的运营成本，并在接下来的一年内扩大市场份额。他们面临的主要挑战是设备老化和市场竞争加剧。客户过去对技术升级反应积极，但对成本控制有严格的要求。
"""

assistant = PreSalesAssistant()
final_plan = assistant.execute(requirements)
# 打印最终方案
print("==========最终方案如下:=============================")
print(final_plan)
